// hdu2492
// 题意：有n(<=20000)个不同的数，现在要统计里面有多少个三元组(ai, aj, ak)
//       (i < j < k)使得ai<aj<ak或者ai>aj>ak。
//
// 题解：很简单。将原数列排序，然后按小到大和大到小顺序做两遍。维护出
//       每个数左边、右边比它大或小的数的个数。然后枚举中间那个数就能
//       算出答案。
//
// 统计：249ms, 10min, 1a
//
// run: $exec < input
#include <iostream>
#include <cstring>
#include <algorithm>

struct data { int v, id; };

bool operator<(data const & a, data const & b)
{
	return a.v < b.v;
}

int const maxn = 20007;
int tree[maxn];
data da[maxn];
int lmin[maxn], lmax[maxn], rmin[maxn], rmax[maxn];
int n;

int lowbit(int x) { return x & -x; }

int get_sum(int id)
{
	int ret = 0;
	for (; id; id -= lowbit(id)) ret += tree[id];
	return ret;
}

void update(int id, int d)
{
	for (; id <= n; id += lowbit(id)) tree[id] += d;
}

int main()
{
	std::ios::sync_with_stdio(false);
	int T; std::cin >> T;
	while (T--) {
		std::cin >> n;
		for (int i = 0; i < n; i++) {
			std::cin >> da[i].v;
			da[i].id = i + 1;
		}
		std::sort(da, da + n);

		std::memset(tree, 0, sizeof(tree));
		for (int i = 0; i < n; i++) {
			lmin[da[i].id] = get_sum(da[i].id - 1);
			rmin[da[i].id] = get_sum(n) - get_sum(da[i].id);
			update(da[i].id, 1);
		}

		std::memset(tree, 0, sizeof(tree));
		for (int i = n - 1; i >= 0; i--) {
			lmax[da[i].id] = get_sum(da[i].id - 1);
			rmax[da[i].id] = get_sum(n) - get_sum(da[i].id);
			update(da[i].id, 1);
		}

		long long ans = 0;
		for (int i = 0; i < n; i++) {
			ans += (long long)lmin[i] * (long long)rmax[i];
			ans += (long long)lmax[i] * (long long)rmin[i];
		}
		std::cout << ans << '\n';
	}
}

